package br.com.qualityempresa.core

import br.com.qualityempresa.seguranca.AutorizacaoController
import br.com.qualityempresa.seguranca.PasswordCodec
import br.com.qualityempresa.seguranca.Perfil
import br.com.qualityempresa.seguranca.Usuario
import br.com.qualityempresa.seguranca.UsuarioService

class PainelController extends AutorizacaoController {

	UsuarioService usuarioService
	
    def index() {}
	
	def login = {}
	
	def verificarPermisssaoAcessoColaboradorHorario(){		
		return true		
	}
	
	def authenticate = {
		params.hashSenha = PasswordCodec.hashEncode(params?.senha)
		def usuario = Usuario.findByEmailAndHashSenha(params?.email, params?.hashSenha)
		
		if (usuario) {
			if (!usuario.ativo) {
				flash.warning = message(code: 'usuario.autenticado.inativo', args: [params.email])
				redirect(action:"login")
				return
			}
			if(usuario.perfil.id == Perfil.PERFIL_ADMINISTRADOR_ID || usuario.perfil.id == Perfil.PERFIL_ADMINISTRADOR_SISTEMA_ID || verificarPermisssaoAcessoColaboradorHorario()){ 
				
				usuario.ultimoAcesso = new Date()
				usuario = usuarioService.salvar(usuario)		
				if (usuario) { 
					setUsuarioAutenticado(usuario)
					flash.success = message(code: 'usuario.autenticado.sucesso', args: [usuario.nome])
					if (session.previousAction) {
						if (session.previousController) {
							redirect(controller: session.previousController, action: session.previousAction)
						} else {
							redirect(action: session.previousAction)
						}
					} else {
						if (session.previousController) {
							redirect(controller: session.previousController)
						}
					}
					response.sendRedirect("${request.contextPath}/")
				} else {
					response.sendRedirect("${request.contextPath}/")
				}
			}else{
				flash.error = message(code: 'usuario.autenticado.foraDoHorario', args: [params.email])
				redirect(action:"login")
			}
		} else {
			flash.error = message(code: 'usuario.autenticado.erro', args: [params.email])
			redirect(action:"login")
		}
	}

	def active = {
		def email = URLEncoder.encode(params.email.toString(), "UTF-8")
		def usuarioInstance = Usuario.findByEmail(email)
		if (usuarioInstance) {
			flash.success = message(code: 'usuario.ativado.sucesso', args: [usuarioInstance.nome])
			usuarioInstance.ativo = true
			if (usuarioInstance.save(flush: true)) {
				  redirect(action:"index")
			}
		} else {
			flash.error = message(code: 'usuario.autenticado.erro', args: [params.email])
			redirect(action:"login")
		}
	}
	
	def gerarSenha = {
		Random r = new Random();
		def String secret1 = "!@#%()@"
		def token1 = secret1.charAt(r.nextInt(secret1.length()))
		
		def String secret2 = "abcdefghijklmnopqrstuvxz"
		def token2 = secret2.charAt(r.nextInt(secret2.length()))
		
		def String token3 = PasswordCodec.showRandomInteger(100000,999999,new Random())
		
		def String senha = token1.toString() + token2.toString() + token3.toString()
		return senha
	}

	def esqueciSenha = {
		def usuario
		if (params.email) {
			usuario = Usuario.findByEmailAndAtivo(params.email, true)
		} else {
			flash.warning = message(code: 'usuario.esqueci.senha.nao.informado')
			redirect(action:"login")
			return
		}		
		if (usuario) {	
			usuario = Usuario.get(usuario.id)
			def novaSenha = gerarSenha();
			
			usuario.atualizarSenha(novaSenha)
			if (usuario.save(flush: true)) {
				usuario.senha = novaSenha
				def String template = '/email/lembrarSenha'
				def String subject = message(code: 'usuario.email.lembrar.senha.titulo')
				if (enviarEmailUsuario(usuario, subject, template)) {
					flash.message = message(code: 'usuario.esqueci.senha.nova.senha.gerada')
				} else {
					flash.error = message(code: 'usuario.esqueci.senha.nova.senha.error.email')
				}
				redirect(action: "login")
			}
		} else {
			flash.error = message(code: 'usuario.esqueci.senha.nao.encontrado')
			redirect(action:"login")
		}
	}
	
		
	def sair = {
		flash.message = message(code: 'usuario.sair', args: [getUsuarioAutenticado()?.nome])
		setUsuarioAutenticado(null)
		redirect(controller:"painel", action:"login")
	}

	def acessoNegado = {}
	
	def naoEncontrado = {}
	
	def erro = {}
	
}
